package 线程池;

import java.util.concurrent.*;

/**
 * 线程池 3大方法 7大参数 4种拒绝策略
 *
 *
 * 3大方法 固定线程 Executors.newFixedThreadPool(5)
 *        单一线程  Executors.newSingleThreadExecutor()
 *        动态线程   Executors.newCachedThreadPool
 *
 *
 * 7大参数
 *  一般都是用这个来进行创建
 * ThreadPoolExecutor(int corePoolSize,   线程核心数  也就是一直在工作的线程 他不休息
*                               int maximumPoolSize,  最大线程数  就是当超出线程核心数+阻塞队列数 才会进行触发   他只会在忙的时候出现
*                               long keepAliveTime,   没有使用线程时间   会进行回收
*                               TimeUnit unit,     单位
*                               BlockingQueue<Runnable> workQueue,  阻塞队列
 *                               factry  线程工厂 创建线程的
*                               RejectedExecutionHandler handler   拒绝策略
 *                               )
 *
 *
 *
 *   四大策略
 *   默认策略
 *   AbortPolicy 超出最大线程池加+阻塞队列数量  会直接抛出异常 并且丢弃任务
 *   Task 线程池.PoolTest$$Lambda$15/0x0000027f95001200@7ef20235 rejected
 *
 *
 *   不会抛出异常 并丢弃
 *
 *   不会抛出异常 交给使用者去进行处理
 *
 *              和最早拿到线程进行竞争
 *
 *
 */
public class PoolTest {


    public static void main(String[] args) {
//
//        test1();


        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 9; i++) {
            threadPoolExecutor.execute(()->{
                System.out.println(Thread.currentThread().getName()+" ：： 拿到资源");
            });
        }
    }





    private static void test1() {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 100; i++) {
            executorService.execute(
                    ()->{
                        System.out.println(Thread.currentThread().getName()+" ：： 拿到资源");
                    }
            );
        }

        executorService.shutdown();
    }
}
